[bits 32]
; void switch_to(struct task_struct* cur, struct task_struct* next)
global switch_to
switch_to:
    ; 因为ABI的问题 被调函数需要保证主调函数的这些寄存器不被改变
    push esi
    push edi
    push ebx
    push ebp

    ; --------------------------保存上文--------------------------
    ; 获取当前线程pcb
    mov eax, [esp + 20]
    ; 线程pcb第一个成员是self_stack,我们将esp指针保存到pcb的线程栈里面
    mov [eax], esp

    ; --------------------------恢复下文--------------------------
    ; 获取下一个要运行的线程的pcb
    mov eax, [esp + 24]
    ; 将之前pcb中的线程栈放到esp中
    mov esp, [eax]

    pop ebp
    pop ebx
    pop edi
    pop esi
    ret
